//
//  PictureSelectorViewController.swift
//  照片选择
//
//  Created by wxy on 15/9/13.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit

// 可重用标识符
private let PictureSelectorCellID = "PictureSelectorCellID"
// 最大选择照片数量
private let MaxPictureCount = 9

class PictureSelectorViewController: UICollectionViewController, PictureSelectorCellDelegate {
    
    // 照片数组 - 数据源
    lazy var pictures = [UIImage]()
    // 用户当前选中照片的索引
    private var currentIndex = 0
    
    // MARK:- 搭建界面
    init() {
        
        // 非空layout
        let layout = UICollectionViewFlowLayout()
        
        // 设置布局
        layout.itemSize = CGSize(width: 80, height: 80)
        layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        
        super.init(collectionViewLayout: layout)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView?.backgroundColor = UIColor(white: 0.97, alpha: 1.0)

        // Register cell classes
        self.collectionView!.registerClass(PictureSelectorCell.self, forCellWithReuseIdentifier: PictureSelectorCellID)

    }

    // MARK: UICollectionViewDataSource

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        
        // 至少要由一个按钮允许用户添加照片 达到最大数量限制，就不再添加
        return pictures.count + (pictures.count == MaxPictureCount ? 0 : 1)
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(PictureSelectorCellID, forIndexPath: indexPath) as! PictureSelectorCell
    
        cell.pictureDelegate = self
        
        // 设置图片 比数据源多一个 让最后一个座位添加照片按钮
        cell.image = indexPath.item < pictures.count ? pictures[indexPath.item] : nil
        
        return cell
    }
    
    // 选择照片
    // Camera 相机
    // PhotoLibrary 照片库 - 包含相册 包括iTunes/iPhoto 同步的照片 不允许在手机上删除
    // SavedPhotosAlbum 相册
    
    
    // MARK: - UICollectionViewDelegate
    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
            
            print("无法访问相册")
            return
        }
        
        // 记录用户当前选中的照片
        currentIndex = indexPath.item
        
        // 访问相册
        let vc = UIImagePickerController()
        
        // 监听照片的选择
        vc.delegate = self
        
        // 允许编辑
        // vc.allowsEditing = true
        
        presentViewController(vc, animated: true, completion: nil)
    }
    
    // MARK: - PictureSelectorCellDelegate
    private func pictureSelectorCellClickCloseButton(cell: PictureSelectorCell) {
        
        // 根据 cell 获得当前的索引
        if let indexPath = collectionView?.indexPathForCell(cell) where indexPath.item < pictures.count {
            
            // 删除对应索引的图片
            pictures.removeAtIndex(indexPath.item)
            
            // 刷新视图
            collectionView?.reloadData()
        }
    }

}

// MARK: - UIImagePickerControllerDelegate,UINavigationControllerDelegate
extension PictureSelectorViewController: UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    
    // 一旦实现了方法就需要手动关闭控制器
    // 凡是开发相册相关应用 大多需要考虑内存的问题
    // UIImageJPEGRepresentation 严重影响图片质量
    
    /// 关于应用程序内存，UI的App空的程序运行占用 20M 左右，一个cocos2dx空模板建立应用程序运行会占 70M 内存
    /// 一般程序消耗在 100M 以内都是可以接受的
    /// 参考数据：在 5s 一次测试数据，一直 sdwebimage 加载网络图像
    /// 内存飙升到 500M 接收到第一次内存警告！内存释放后的结果120M，程序仍然能够正常运行

    /// 选中照片代理方法
    ///
    /// - parameter picker:      picker 选择控制器
    /// - parameter image:       选中的图片
    /// - parameter editingInfo: 编辑字典，在开发选择用户头像时，格外有用
    /// vc.allowsEditing = ture 一旦允许编辑，选中图片会小
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        
        let scaleImage = image.scaleImageToWidth(300)
        
        // 更新数据源
        // 选择图片
        if currentIndex < pictures.count {
            // 替换图片
            print("选中索引是 \(currentIndex)")
            
            pictures[currentIndex] = scaleImage
        } else {
            // 添加图片
            pictures.append(scaleImage)
        }
        
        // 刷新视图
        collectionView?.reloadData()

        
        dismissViewControllerAnimated(true, completion: nil)
    }
}

// 照片选择 cell 的协议
private protocol PictureSelectorCellDelegate: NSObjectProtocol {
    
    // 选中删除按钮 - collectionView / tableView Cell 一个视图会包含多个cell 在定义代理方法的时候 一定要将自己传过去 从而获取 cell 的属性
    // 通过 cell 的属性 控制器能够判断点击的对象
    func pictureSelectorCellClickCloseButton(cell: PictureSelectorCell)
}

// 照片选择 自定义cell
private class PictureSelectorCell: UICollectionViewCell {
    
    var image: UIImage? {
        
        didSet {
            
            if image != nil {
                addButton.setImage(image, forState: UIControlState.Normal)
            } else {
                // 显示默认的加号图片
                addButton.setImage(UIImage(named: "compose_pic_add"), forState: UIControlState.Normal)
            }
            
            // 如果没有图片 隐藏关闭按钮
            closeButton.hidden = (image == nil)
        }
    }
    
    // 定义代理
    weak var pictureDelegate: PictureSelectorCellDelegate?
    
    // 点击关闭按钮
    @objc private func clickClose() {
    
        // 通知代理 执行方法
        pictureDelegate?.pictureSelectorCellClickCloseButton(self)
        
    }
    
    // frame 是根据layout的 itemSize 来的
    override init(frame: CGRect) {
        super.init(frame: frame)
        setUpUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 搭建页面
    private func setUpUI() {
        
        contentView.addSubview(addButton)
        contentView.addSubview(closeButton)
        
        // 布局
        addButton.frame = bounds
        
        closeButton.translatesAutoresizingMaskIntoConstraints = false
        let viewDict = ["btn": closeButton]
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[btn]-(0)-|", options: [], metrics: nil, views: viewDict))
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(0)-[btn]", options: [], metrics: nil, views: viewDict))
        
        // 禁用添加按钮 否则无法触发didSelected代理方法
        // 禁用按钮不会显示高亮图像
        addButton.userInteractionEnabled = false
        
        // 通过修改 imageView 才能修改按钮的 contentMode
        addButton.imageView!.contentMode = UIViewContentMode.ScaleAspectFill
        
        // 添加监听方法
        closeButton.addTarget(self, action: "clickClose", forControlEvents: .TouchUpInside)
        
    }
    
    // MARK: - 懒加载控件
    // TODO: - 可以使用UIImageView
    
    // 添加照片
    private lazy var addButton: UIButton = UIButton(imageName:"compose_pic_add")
    // 删除照片
    private lazy var closeButton: UIButton = UIButton(imageName:"compose_photo_close")
}
